package com.wusiwei.controller;

import com.wusiwei.common.Result;
import com.wusiwei.entity.Invoice;
import com.wusiwei.service.InvoiceService;
import com.wusiwei.util.AliOssUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;

/**
 * 文件上传控制器
 */
@RestController
@RequestMapping("/api/file")
@Tag(name = "文件管理", description = "文件上传相关的API接口")
public class FileController {

    private static final Logger log = LoggerFactory.getLogger(FileController.class);

    @Autowired
    private InvoiceService invoiceService;

    /**
     * 文件上传接口
     *
     * @param file      上传的文件
     * @param invoiceId 关联的发票ID（可选）
     * @return 文件访问URL
     */
    @PostMapping("/upload")
    @Operation(summary = "上传文件", description = "上传文件并返回访问URL，可选关联到发票")
    public Result<String> upload(
            @Parameter(description = "要上传的文件") MultipartFile file,
            @Parameter(description = "关联的发票ID(可选)") @RequestParam(required = false) Long invoiceId) throws Exception {
        // 验证文件是否为空
        if (file.isEmpty()) {
            return Result.error("上传文件不能为空");
        }
        // 获取原始文件名和后缀
        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null || originalFilename.isEmpty()) {
            return Result.error("文件名不能为空");
        }
        String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
        // 验证文件类型
        if (!".jpg".equals(suffix) && !".jpeg".equals(suffix) && !".png".equals(suffix) && !".pdf".equals(suffix)) {
            return Result.error("只支持jpg、jpeg、png和pdf格式的文件");
        }
        // 验证文件大小
        if (file.getSize() > 10 * 1024 * 1024) {
            return Result.error("文件大小不能超过10MB");
        }
        // 生成随机文件名
        String filename = UUID.randomUUID() + suffix;
        // 调用AliOssUtil工具类上传文件
        String url = AliOssUtil.uploadFile(filename, file.getInputStream());
        log.info("文件上传成功，URL: {}", url);
        // 如果提供了发票ID，直接更新发票的文件路径
        if (invoiceId != null) {
            try {
                // 查询发票是否存在
                Invoice invoice = invoiceService.getById(invoiceId);
                if (invoice == null) {
                    return Result.error("发票不存在，ID: " + invoiceId);
                }
                // 更新发票的文件路径
                invoice.setFilePath(url);
                invoiceService.update(invoice);
                log.info("发票文件路径已更新，ID: {}, 文件URL: {}", invoiceId, url);
            } catch (Exception e) {
                log.error("更新发票文件路径失败，ID: {}", invoiceId, e);
                return Result.error("文件上传成功，但更新发票文件路径失败: " + e.getMessage());
            }
        }
        return Result.success(url);
    }

//    /**
//     * 删除文件
//     *
//     * @param fileUrl   文件URL
//     * @param invoiceId 关联的发票ID（可选）
//     * @return 删除结果
//     */
//    @DeleteMapping("/delete")
//    @Operation(summary = "删除文件", description = "删除上传的文件，可选关联到发票")
//    public Result<Boolean> deleteFile(
//            @Parameter(description = "文件URL") @RequestParam String fileUrl,
//            @Parameter(description = "关联的发票ID(可选)") @RequestParam(required = false) Long invoiceId) {
//        try {
//            // 验证文件URL是否为空
//            if (fileUrl == null || fileUrl.isEmpty()) {
//                return Result.error("文件URL不能为空");
//            }
//
//            // 调用AliOssUtil工具类删除文件
//            boolean success = AliOssUtil.deleteFile(fileUrl);
//
//            // 如果提供了发票ID，清除发票的文件路径
//            if (invoiceId != null && success) {
//                try {
//                    // 查询发票是否存在
//                    Invoice invoice = invoiceService.getById(invoiceId);
//                    if (invoice != null && fileUrl.equals(invoice.getFilePath())) {
//                        // 清除发票的文件路径
//                        invoice.setFilePath(null);
//                        invoiceService.update(invoice);
//                        log.info("发票文件路径已清除，ID: {}", invoiceId);
//                    }
//                } catch (Exception e) {
//                    log.error("清除发票文件路径失败，ID: {}", invoiceId, e);
//                    return Result.error("文件删除成功，但清除发票文件路径失败: " + e.getMessage());
//                }
//            }
//
//            return Result.success(success);
//        } catch (Exception e) {
//            log.error("删除文件失败", e);
//            return Result.error("删除文件失败: " + e.getMessage());
//        }
//    }
//
//    /**
//     * 上传Base64编码的图片
//     *
//     * @param requestBody 包含Base64编码的图片数据和模块名称
//     * @return 上传结果
//     */
//    @PostMapping("/upload-base64")
//    @Operation(summary = "上传Base64编码的图片", description = "上传Base64编码的图片并返回访问URL")
//    public Result<String> uploadBase64Image(
//            @Parameter(description = "Base64编码的图片数据") @RequestBody Map<String, String> requestBody) {
//        try {
//            String base64Data = requestBody.get("base64Data");
//            String module = requestBody.get("module");
//
//            if (base64Data == null || base64Data.isEmpty()) {
//                return Result.error("Base64数据不能为空");
//            }
//
//            if (module == null || module.isEmpty()) {
//                module = "common";
//            }
//
//            // 调用AliOssUtil工具类上传Base64图片
//            String url = AliOssUtil.uploadBase64Image(base64Data, module);
//
//            log.info("Base64图片上传成功，URL: {}", url);
//
//            return Result.success(url);
//        } catch (Exception e) {
//            log.error("上传Base64图片失败", e);
//            return Result.error("上传Base64图片失败: " + e.getMessage());
//        }
//    }
} 